<?php
	include_once('Base.class.php');
	include_once('Str_all.class.php');
	include_once('Constant.class.php');
	include_once('Arr.class.php');
	include_once('Regular.class.php');
	include_once('Date.class.php');
	include_once('File.class.php');

	//函数(类)外声明变量
 	$x = 1;

	class W3cSchool extends Base{
		use Str_all;
		use Constant;
		use Arr;
		use Regular;
		use Date;
		use File;
		//注释1
		#注释2
		/**
		 *注释3
		 */
		 static function Yf(){
		 	ECHO '函数大小写不敏感!';
		 	$num = '<br/>变量大小写敏感!';
		 	echo $num,@$NUM;
		 }



		 static function Bl(){
		 	/**
		 	 * 变量名称必须以字母或下划线开头
		 	 * 变量会在首次为其赋值时被创建
			*/

		 	/**
		 	 * 变量作用域
			 *  local（局部）
			 *  global（全局）
			 *  static（静态）
		 	 */

			//当函数完成/执行后，不删除的变量static
			static $sta = 0;
			echo 'Static sta:'.$sta.'<br/>';
			$sta++;
			//函数内声明变量
			$y = 2;
			echo '函数内输出xy:'.@$x,$y;

			// 这个$GLOBALS[index]在函数内也可以访问，并能够用于直接更新全局变量。
			global $x;
			echo '<br/>函数内输出globalx,y:'.@$x.','.$y;
			echo '<br/>全局GLOBALS:'.$GLOBALS['x'].','.$y;
		 	return;

		 	/**
		 	 * php八大类型变量(数据类型)

		 	 * 四种标量类型：
			 *  boolean （布尔型）
			 *  integer （整型）
			 *  float （浮点型, 也称作 double)
			 *  string （字符串）
			 *  两种复合类型：
			 *  array （数组）
			 *  object （对象）
			 *  最后是两种特殊类型：
			 *  resource　（资源）
			 *  NULL　（NULL）
		 	 */
			var_dump($boolean = false);
			echo '<br/>'.gettype($boolean = false);
			echo '<br/>'.is_bool($boolean = false).'<br/>';

			var_dump($integer = 1);
			echo '<br/>'.gettype($integer = 1);
			echo '<br/>'.is_integer($integer = 1).'<br/>';

			var_dump($float = 1.5);
			echo '<br/>'.gettype($float = 1.5);
			echo '<br/>'.is_float($float = 1.5);
			echo '<br/>'.is_double($float = 1.5).'<br/>';

			var_dump($string = '字符串');
			echo '<br/>'.gettype($string = '字符串');
			echo '<br/>'.is_string($string = '字符串').'<br/>';

			var_dump($array = array('arr'));
			echo '<br/>'.gettype($array = array('arr'));
			echo '<br/>'.is_array($array = array('arr')).'<br/>';

			var_dump($Obj = $base = new Base());
			echo '<br/>'.gettype($Obj = $base = new Base());
			echo '<br/>'.is_object($Obj = $base = new Base()).'<br/>';

			var_dump($resource = fopen('Base.class.php', "r"));
			echo '<br/>'.gettype($resource = fopen('Base.class.php', "r"));
			echo '<br/>'.is_resource($resource = fopen('Base.class.php', "r")).'<br/>';
			//输出资源类型的值用get_resource_type

			var_dump($NULL = NULL);
			echo '<br/>'.gettype($NULL = NULL);
			echo '<br/>'.is_null($NULL = NULL).'<br/>';
		 }

		 static function echo_print(){
		 	echo print("print会返回一个1:");
		 	echo("<br/>echo是一个语言结构\"()\"可有可无");
		 	print '</br/>也可无()';
		 	//※※※※※一个非常重要的区别：在 echo 函数中，可以同时输出多个字符串，而在 print 函数中则只可以同时输出一个字符串。
		 }

		 static function Sjlx(){
		 	//8大数据类型
		 }

		 public function String(){
	 	 	// 一个汉字3,整形、符号、字母_ 1
		 	$str = "测试字符串1.a_";
		 	$str = "aBcD1_ hello world";
		 	$str = "\0\t\raB1_\0\t\r";
		 	$str = "aBc1_1cBa";

			//trait Str_all类
			$this->str_all('zxy');
			return;

			//根据指定的格式解析来自字符串的输入,空格分隔符可以 "/"不行
			$arr = sscanf('http://www.w3school.com.cn php func_string_sscanf.asp',"http://%s %s %s");
			$this->pri($arr);
			return;

			//计算文件的SHA-1散列,可判断文件是否被修改
			echo sha1_file('test.txt');
			return;

			//SHA-1散列,二参原始 20 字符二进制格式 true,默认false
			echo sha1('zxy');
			return;

			/**
			 * 预定以字符前添加反斜杠
			 * quotemeta()预定义：句号（.）反斜杠（\）加号（+）星号（*）问号（?）方括号（[]）脱字号（^）美元符号（$）圆括号（()）
			 * addslashes()预定义：单引号（'）双引号（"）反斜杠（\）NULL
			 */
			echo quotemeta('quotemeta?');
			return;

			//将quoted-printable字符编码为8位ASCLL字符串 =加两位16进制 意味各种邮件常用符号,详见http://blog.chacuo.net/494.html
			echo $str = quoted_printable_encode('If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy.');
			echo '<br/>	'.quoted_printable_decode($str);
			return;

			/**
			 * echo、print、printf、fprintf、sprintf、vprintf、vfprintf、vsprintf
			 * echo：语言结构,输出,可输出多个字段
			 * print：语言结构,输出,只输出单个字段
			 * printf：格式化输出字符串
			 *
			 */
			echo 1,'ec<br/>ho',2;
			print('<br/>print');
			printf('<br/>%s','printf');
			fprintf(fopen('test.txt','w'),"%s",'fprintf');
			echo '<br/>'.sprintf("%s",'sprintf,与printf区别就是不打印只返回值');
			vprintf('<br/>%s',array('vprintf'));
			vfprintf(fopen('test.txt','w'),"%s",array('vprintf'));
			echo '<br/>'.vsprintf("%s",array('vsprintf'));
			//占位符,※※※双引号!※※※
			vprintf("<br/>1:%1\$s,2:%2\$d",array('占位符',1,2));
			//字符串说明符,※※※双引号!※※※
			vprintf("<br/>[%'*10s]",'vprintf');
			return;

			//把查询字符串解析到变量中：,二参:数组!,直解析?&?
			parse_str('http://172.104.101.57/internship_tp/index.php?m=&c=Single&a=index&id=1',$arr);
			$this->pri($arr);
			die();
			parse_str('http://172.104.101.57/internship_tp/index.php?m=&c=Single&a=index&id=1');
			echo $c,$a,$id;
			return;

			//返回字符串首字母的ASCLL值
			echo ord("zxy");
			echo '<br/>'.ord("z");
			return;

		 	//英文千分位格式化数字,一个参数会进行舍入,还支持四参(规定符号)见手册
		 	echo number_format('1234569.999999',10);
		 	return;

		 	/**
		 	 * 在字符串中的新行（\n）之前插入换行符
		 	 * 二参
		 	 * TRUE- 默认。插入 <br />
			 * FALSE - 插入 <br>
		 	 */
		 	echo nl2br("一行\n两行");
		 	return;

		 	// 函数返回具体的本地信息。注释：※该函数不适用 Windows 平台。即返回localeconv()中特定的的某一项
		 	echo nl_langinfo(ABDAY_);
		 	return;

		 	//格式化货币字符,money_format()※※函数无法在 Windows 平台上工作。
		 	setlocale(LC_MONETARY,"en_US");
		 	echo money_format("windows %i",123.4);
		 	return;

		 	//函数计算字符串的 soundex 键,也表示英语发音,没metaphone准,无二参
		 	echo soundex("soundex");
		 	echo '<br/>'.soundex("Assistance"); //,5);
		 	echo '<br/>'.soundex("Assistants"); //,5);
		 	return;

		 	//计算字符串的 metaphone 键,metaphone 键代表字符串的英语发音。 变音位,二参位数
		 	echo metaphone("metaphone");
		 	echo '<br/>'.metaphone("Assistance"); //,5);
		 	echo '<br/>'.metaphone("Assistants"); //,5);
		 	return;

		 	//计算文件的md5散列
		 	echo md5_file("test.txt");
		 	echo '<br/>'.md5_file("test.txt",true);
		 	return;

		 	/**
		 	 * 计算字符串的 MD5 散列。
		 	 * 二参
		 	 * TRUE - 原始 16 字符二进制格式
			 * FALSE - 默认。32 字符十六进制数
		 	 */
		 	echo md5($str);
		 	echo '<br/>'.md5($str,true);
		 	return;

		 	/**
		 	 * 下三个函数二参
		 	 * 可选。规定从字符串中删除哪些字符。
		 	 * 如果省略该参数，则移除下列所有字符：
			 * "\0" - NULL
			 * "\t" - 制表符
			 * "\n" - 换行
			 * "\x0B" - 垂直制表符
			 * "\r" - 回车
			 * " " - 空格
		 	 */
			//移除字符串两侧的字符,可把两侧想删除的字符和
			echo trim($str,'a');
			return;

		 	//从字符串右删除字符,(查看网页源代码调试)
		 	echo rtrim($str);
		 	return;

		 	//从字符串左删除字符,(查看网页源代码调试)
		 	echo ltrim($str);
		 	return;

		 	//返回一包含本地数字及货币格式信息的数组。数组明细见w3c
		 	setlocale(LC_ALL,"US");
			$locale_info = localeconv();
			$this->pri($locale_info);
			return;
		 	//设置地区,仅针对当前脚本
		 	setlocale(LC_ALL,"US");//美国
		 	setlocale(LC_ALL,NULL);//改回系统默认
		 	return;

		 	// 计算两个字符串的相似度，并返回匹配字符的数目：(三参计算百分比[可略])
		 	echo similar_text($str,'abcd1_',$percent);
		 	echo '<br/>'.$percent.'%';
		 	return;

		 	/**
		 	 * 计算两个字符串之间的 Levenshtein 距离：
		 	 * 后三参(可略)
		 	 * insert	可选。插入一个字符的成本。默认是 1。
			 * replace	可选。替换一个字符的成本。默认是 1。
			 * delete	可选。删除一个字符的成本。默认是 1。
		 	 */
		 	echo levenshtein("Hello World","ello World",3,5,7);
		 	return;

		 	//每个单词的首字母转为大写,※※※空格分割
		 	echo ucwords($str);
		 	return;

		 	//首字母转小写
		 	echo lcfirst($str);
		 	return;

		 	//首字母转大写
		 	echo ucfirst($str);
		 	return;

		 	//字符串转小写
		 	echo strtolower($str);
		 	return;

		 	//字符串转大写
		 	echo strtoupper($str);
		 	return;

		 	//字符串拼接,一参可省略(默认"")但不建议
		 	$imp = array('2017','9','27');
		 	echo implode('-',$imp);
		 	//别名,无任何区别
		 	echo '<br/>'.join('-',$imp);
		 	return;

		 	/**
		 	 * 这四个转换函数二参见w3c
		 	 */

			/**
			* 预定义字符转换为html实体,这个有用,显示html标签本身
			* ※※※这函数二参是重点,默认只解析双引号※※※
			* ENT_COMPAT - 默认。仅编码双引号。
			* ENT_QUOTES - 编码双引号和单引号。
			* ENT_NOQUOTES - 不编码任何引号。
			 */
			echo htmlspecialchars("'a'<b>b</b>"); //源代码:'a'&lt;b&gt;b&lt;/b&gt
		 	return;

		 	//预定义html实体转换为字符
		 	/**
 	 		 * 会被解码的 HTML 实体是：
			 * & 解码成 & （和号）
			 * " 解码成 " （双引号）
			 * ' 解码成 ' （单引号）
			 * < 解码成 < （小于）
			 * > 解码成 > （大于）
		 	 */
		 	echo htmlspecialchars_decode("'a'<b>b</b>");
		 	//和echo没区别
		 	echo "<br/>'a'<b>b</b>";
		 	return;

		 	/**
		 	 * 将字符转化为html实体(网页源代码查看调试结果)
	 		 * 编码表就用get_html_translation_table()函数返回
		 	 */
			echo htmlentities('<');
			return;
			//将html实体转化为字符(网页源代码查看调试结果)
			echo html_entity_decode("&lt;");
			return;

		 	//反向显示希伯来字符，并把新行（\n）转换为 <br>：
			echo hebrevc("? ???? ?????\n");
		 	//无<br/>功能
		 	echo hebrev("? ???? ?????");
		 	return;

		 	// 输出这俩函数的翻译表htmlentities() 和 htmlspecialchars()
		 	$this->pri(get_html_translation_table(HTML_ENTITIES));
		 	return;

		 	/**
		 	  * 一个字节有8位,所以32位int型占用32位/8位=4个字节,
		 	  * 64位int型占用64位/8位=8个字节.
		 	 */

			//php有符号整形最大(2^32)/2-1减1是因为整型包括0.
		 	$large_number = 2147483647;
			var_dump($large_number);

			//php32位无符号最大:2^32-1 = 4294967295
			echo "<br/>";
			printf("%u",4294967296);
			echo "<br/>";

			$large_number = 2147483648;
			var_dump($large_number);	//※※※输出为float 证明当前为32位php
		 	return;

		 	//将格式化字符写入文件,覆盖式写入
		 	$file = fopen("test.txt","w");
			echo fprintf($file,"There are million bicycles in %s.",$str).'<br/>';
			//使用 printf() 来演示fprintf()所有可能的格式值：
		 	$this->testFprintf();
		 	return;

		 	/**
		 	 *字符串打碎
		 	 *三参:
		 	 *大于 0 - 返回包含最多 三参 个元素的数组
			 *小于 0 - 返回包含除了最后的 -三参 个元素以外的所有元素的数组
			 *0 - 返回包含一个元素的数组
		 	 */
		 	$this->pri(explode('-', '2017-9-26',2));
		 	$this->pri(explode('-', '2017-9-26',-1));
		 	return;

		 	//单引号和双引号的区别。单引号将输出变量名称，而不是值
		 	echo '$str'."<br/>$str";
		 	return;

		 	$this->testCrypt($str);
		 	echo '<br/>Self md5:'.md5($str);
		 	return;

		 	//crc冗余码 建议用printf/sprintf,必须用%u
		 	printf("%u\n",crc32($str));
		 	return;

		 	/**
 		 	 * 字符串中所用字符信息
		 	 * 0 - 数组，ASCII 值为键名，出现的次数为键值
			 * 1 - 数组，ASCII 值为键名，出现的次数为键值，只列出出现次数大于 0 的值
			 * 2 - 数组，ASCII 值为键名，出现的次数为键值，只列出出现次数等于 0 的值
			 * 3 - 字符串，带有所有使用过的不同的字符
			 * 4 - 字符串，带有所有未使用过的不同的字符
		 	 */
		 	$this->pri(count_chars($str,1));
		 	echo count_chars($str,3);
		 	return;

		 	//使用 uuencode 算法对字符串进行编码
		 	echo $encode = convert_uuencode($str);
		 	//解码,无二参
		 	echo '<br/>'.convert_uudecode($encode);
		 	return;

		 	/**
		 	 * 把字符串由一种 Cyrillic 字符集转换成另一种
		 	 * k - koi8-r
			 * w - windows-1251
			 * i - iso8859-5
			 * a - x-cp866
			 * d - x-cp866
			 * m - x-mac-cyrillic
		 	 */
			echo convert_cyr_string($str,'w','d');
			return;

		 	//在每二参个字符处分割并添加参字符,末尾也有一个三参
		 	echo chunk_split($str,3,'+');
		 	return;

		 	//ASCLL转字符
		 	echo chr(61) . "<br>";
		 	echo chr(061); // 八进制值,n进制都行
		 	return;

		 	//从字符串右侧删除字符
		 	echo chop('aaa\n\nb','b');
		 	/**
		 	 * 用双引号先解析,单引号不行
		 	 * 无二参自动删除
		 	 * "\0" - NULL
			 * "\t" - 制表符
		 	 * "\n" - 换行
			 * "\x0B" - 垂直制表符
			 * "\r" - 回车
			 * " " - 空格
		 	 */
		 	echo '<br/>'.chop("aaa\n\n");
		 	return;

		 	//ASCLL转十六进制
		 	echo bin2hex($str);
		 	return;

		 	//十六进制转二进制
			echo hex2bin('e58d81e585ade8bf9be588b6e8bdace4ba8ce8bf9be588b6');
			return;

			//再转回去,参数H*未知
			echo '<br/>'.pack("H*",bin2hex($str));
			return;
		 	/**
		 	  * 返回当前 magic_quotes_gpc 配置选项的设置
		 	  * BUT5.4+魔术引号功能已经从 PHP 中移除了
		 	 */
		 	var_dump(get_magic_quotes_gpc());
		 	return;

		 	//帮你转义,可用于组织sql字符串,进sql之前的语句都加一个这个
		 	echo addslashes('"a"\b NULL c');
		 	return;

		 	//一参字符串 二参在二参字符前加\
		 	echo addcslashes($str, '1');
		 	return;

		 	//检索字符串,返回第多少个字符
		 	echo strpos($str,'1');
			return;

		 	//以字符计长度
		 	echo strlen($str);
		 }

		 public function constant(){
			 $this->cons();
		 }

		 public function calculate(){
			 //do while和while是一样的运行结果,但条件不满足时do while多一次
			 $a = 0;
			 do {
				 var_dump('a');
				 $a++;
			 } while ($a <= -1);
			 return;

			 $a = 0;
			 while ($a <= 2) {
				 var_dump('a');
				 $a++;
			 }
			 return;

			 //数组运算符
			 echo array('1'=>1) !== array('1'=>'1');
			 return;

			 echo array('1'=>'1') <> array('1'=>'2');
			 return;

			 echo array('1'=>'1') != array('1'=>'2');
			 return;

			 echo array('1'=>'1','2'=>'2') === array('1'=>'1','2'=>'2');
			 return;

			 echo array(1=>1,2=>2) == array('1'=>'1','2'=>'2');
			 return;

			 //"+"必须键名不一样
			 $arr = array('a','b') + array('k'=>'c','kk'=>'d');
			 $this->pri($arr);
			 return;

			 //逻辑运算符
			 echo 1 and 1,1 && 1;
			 echo '<br/>'.(1 or 0),1 || 0;
			 echo '<br/>'.(1 xor 1),!0;
			 return;

			 //不等于
			 echo 1!=2;
			 echo '<br/>';
			 echo 1<>2;
			 echo '<br/>';
			 //不全等于,类型不一样
			 echo '1'!==1;
			 return;

			 //串接,分明同下
			 $str = 'zxy';
			 echo $str = $str.'AAA';
			 echo '<br/>';
			 echo $str .= 'AAA';
			 return;

			 $x = 8;
			 echo $x+=2;
			 echo '<br/>'.$x-=2;
			 echo '<br/>'.$x*=2;
			 echo '<br/>'.$x/=2;
			 echo '<br/>'.$x%=2;
			 return;
		 }

		 public function fun(){
			 /**
			  * PHP 的真正力量来自它的函数：它拥有超过 1000 个内建的函数。
			  * 自建函数:页面加载时函数不会立即执行。函数只有在被调用时才会执行。
				* 用户定义的函数声明以关单 "function" 开头：
				* 函数名能够以字母或下划线开头（而非数字）。
				*	注释：函数名对大小写不敏感。
			  */
		 }

		 public function globals(){
			 	/**
			 	 * GET vs. POST
				 * $_GET 是通过 URL 参数传递到当前脚本的变量数组。
				 * $_POST 是通过 HTTP POST 传递到当前脚本的变量数组。
			 	 */

				 if ($_SERVER["REQUEST_METHOD"] == "POST") {
 					$this->pri($_POST);
 					foreach ($_POST as $v) {
 						$v = $this->test_input($v);
 					}
 					$this->pri($_POST);

 					//判空显示红色,不用isset的原理见比较类文件
 					if (empty($_POST['text'])) {
 						$wrong_text = '请填写内容!';
 					}
 				}

				 //XSS攻击【要找支持mouceover的浏览器】http://my.project.com/mianshiti/W3cSchool.class.php?xss=1' onmouseover='javascript:alert(1)'
			 	echo "
				<!DOCTYPE html>
				<html>
					<head>
						<meta charset='utf-8'>
						<title></title>
					</head>
					<body>
						<!--htmlspecialchars函数-->
						<a href='".htmlspecialchars($_SERVER['PHP_SELF'])."?subject=PHP&web=W3school.com.cn'>测试 \$GET</a>
						<form class='' action='".htmlspecialchars($_SERVER['PHP_SELF'])."' method='post'>
							<input type='text' name='text' value='".htmlspecialchars(@$_GET['xss'],ENT_QUOTES)."'>
							<span style='background-color:red'>".htmlspecialchars(@$wrong_text)."</span>
							<input type='submit' name='submit' value='测试REQUEST'>
						</form>
					</body>
				</html>
				";
				return;

				// if (isset($_POST['submit'])) {
				// 	echo 'SERVER='.$_SERVER['REQUEST_METHOD'];
				// 	$this->pri($_REQUEST);
				// 	$this->pri($_POST);
				// }
				//
				// if (isset($_GET['submit'])) {
				// 	$this->pri($_REQUEST);
				// 	$this->pri($_GET);
				// }

				if (isset($_GET)) {
					$this->pri($_REQUEST);
					$this->pri($_GET);
				}
				return;

			 	//重要元素 见w3c
			 	$this->pri($_SERVER);
				return;

				$this->pri($GLOBALS);
				echo $GLOBALS['x'];
		 }

		 public function test_input($value){
			 /**
			  * trim二参为空 则删除一参两侧一下所有预定义字符
			  * "\0" - NULL
				* "\t" - 制表符
				* "\n" - 换行
				*"\x0B" - 垂直制表符
				* "\r" - 回车
				* " " - 空格
			  */
			 $value = trim($value);	//去除空格 制表符 换行符
			 $value = stripslashes($value);	//去除反斜杠\
			 $value = htmlspecialchars($value,ENT_QUOTES);	//双引号(和单引号)转换为html实体
			 return $value;
		 }

	}

	// phpinfo();	//7.0.12
	// W3cSchool::Yf();
	// W3cSchool::Bl();

	// //测试static
	// echo '<br/>';
	// W3cSchool::Bl();

	// echo '<br/>函数(类)外输出xy:'.$x,@$y;

	// W3cSchool::echo_print();
	$w3c = new W3cSchool();
	// $w3c->String();
	// $w3c->constant();
	// $w3c->calculate();
	// $w3c->fun();
	// $w3c->arr();
	// $w3c->globals();.

	//正则
	// $w3c->reg_name('aasds');
	// $w3c->reg_name('a*s');

	// $w3c->reg_email('787956151@qq.com');
	// $w3c->reg_email('787956151@q*.q.com');

	// $w3c->reg_img('aa.PNG');
	// $w3c->reg_img('aa.PNGa');

	// $w3c->reg_url('http://www.w3school.com.cn/php/php_form_url_email.asp');
	// $w3c->reg_url('http://www.w3school.com@xx.cn/php/php_form_url_email.asp');

	// $w3c->practiceDate();
	$w3c->testFile();

	// $color = "red";
 ?>
<!-- 原生模板输出变量简写（只适用于 short_open_tag 配置设置启用的情况） -->
<!-- <p>Roses are <?=$color?></p>  -->
